package com.apikey.auth.service.impl;

import com.apikey.auth.provider.ApiKeyUserProvider;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * 默认的API Key用户信息提供者实现
 * 提供基础的用户信息管理功能，可以被自定义实现替换
 *
 * @author API Key Framework
 * @version 1.0
 */
@Component
public class DefaultApiKeyUserProvider implements ApiKeyUserProvider {

    // 模拟用户数据存储，实际使用时应该连接真实的用户系统
    private static final Map<String, UserInfo> USERS = new HashMap<>();

    static {
        // 初始化一些默认用户数据
        USERS.put("admin", new UserInfo("admin", "admin", "admin@example.com", "系统管理员", true, "ADMIN"));
        USERS.put("user1", new UserInfo("user1", "user1", "user1@example.com", "普通用户1", true, "USER"));
        USERS.put("user2", new UserInfo("user2", "user2", "user2@example.com", "普通用户2", true, "USER"));
        USERS.put("developer", new UserInfo("developer", "developer", "dev@example.com", "开发者", true, "DEVELOPER"));
    }

    /**
     * 根据用户ID获取用户信息
     */
    @Override
    public UserInfo getUserById(String userId) {
        return USERS.get(userId);
    }

    /**
     * 根据用户名获取用户信息
     */
    @Override
    public UserInfo getUserByUsername(String username) {
        return USERS.values().stream()
                .filter(user -> username.equals(user.getUsername()))
                .findFirst()
                .orElse(null);
    }

    /**
     * 验证用户是否存在且有效
     */
    @Override
    public boolean isValidUser(String userId) {
        UserInfo user = getUserById(userId);
        return user != null && user.isActive();
    }

    /**
     * 验证用户是否有权限创建API Key
     */
    @Override
    public boolean canCreateApiKey(String userId) {
        UserInfo user = getUserById(userId);
        if (user == null || !user.isActive()) {
            return false;
        }

        // 管理员和开发者可以创建API Key
        String role = user.getRole();
        return "ADMIN".equals(role) || "DEVELOPER".equals(role) || "USER".equals(role);
    }

    /**
     * 验证用户是否有权限管理指定的API Key
     */
    @Override
    public boolean canManageApiKey(String userId, String apiKeyValue) {
        UserInfo user = getUserById(userId);
        if (user == null || !user.isActive()) {
            return false;
        }

        // 管理员可以管理所有API Key
        if ("ADMIN".equals(user.getRole())) {
            return true;
        }

        // 其他用户只能管理自己的API Key
        // 这里简化处理，实际应该查询API Key的所有者
        return true; // 简化实现，实际需要查询数据库
    }

    /**
     * 获取用户的API Key数量限制
     */
    @Override
    public int getApiKeyLimit(String userId) {
        UserInfo user = getUserById(userId);
        if (user == null) {
            return 0;
        }

        // 根据用户角色设置不同的限制
        switch (user.getRole()) {
            case "ADMIN":
                return -1; // 无限制
            case "DEVELOPER":
                return 10; // 开发者最多10个
            case "USER":
                return 3;  // 普通用户最多3个
            default:
                return 1;  // 默认1个
        }
    }

    /**
     * 获取用户的默认权限列表
     */
    @Override
    public String getDefaultPermissions(String userId) {
        UserInfo user = getUserById(userId);
        if (user == null) {
            return "";
        }

        // 根据用户角色设置默认权限
        switch (user.getRole()) {
            case "ADMIN":
                return "*"; // 管理员拥有所有权限
            case "DEVELOPER":
                return "read,write,delete"; // 开发者拥有读写删除权限
            case "USER":
                return "read"; // 普通用户只有读权限
            default:
                return "read"; // 默认只读权限
        }
    }

    /**
     * 添加新用户（用于测试和演示）
     *
     * @param userInfo 用户信息
     */
    public void addUser(UserInfo userInfo) {
        if (userInfo != null && userInfo.getUserId() != null) {
            USERS.put(userInfo.getUserId(), userInfo);
        }
    }

    /**
     * 更新用户信息
     *
     * @param userId   用户ID
     * @param userInfo 新的用户信息
     * @return 是否更新成功
     */
    public boolean updateUser(String userId, UserInfo userInfo) {
        if (userId != null && userInfo != null && USERS.containsKey(userId)) {
            USERS.put(userId, userInfo);
            return true;
        }
        return false;
    }

    /**
     * 删除用户
     *
     * @param userId 用户ID
     * @return 是否删除成功
     */
    public boolean removeUser(String userId) {
        return USERS.remove(userId) != null;
    }

    /**
     * 激活用户
     *
     * @param userId 用户ID
     * @return 是否激活成功
     */
    public boolean activateUser(String userId) {
        UserInfo user = USERS.get(userId);
        if (user != null) {
            user.setActive(true);
            return true;
        }
        return false;
    }

    /**
     * 停用用户
     *
     * @param userId 用户ID
     * @return 是否停用成功
     */
    public boolean deactivateUser(String userId) {
        UserInfo user = USERS.get(userId);
        if (user != null) {
            user.setActive(false);
            return true;
        }
        return false;
    }

    /**
     * 获取所有用户列表（用于管理界面）
     *
     * @return 用户列表
     */
    public Map<String, UserInfo> getAllUsers() {
        return new HashMap<>(USERS);
    }

    /**
     * 根据角色获取用户数量
     *
     * @param role 角色
     * @return 用户数量
     */
    public long countUsersByRole(String role) {
        return USERS.values().stream()
                .filter(user -> role.equals(user.getRole()))
                .count();
    }

    /**
     * 获取活跃用户数量
     *
     * @return 活跃用户数量
     */
    public long getActiveUserCount() {
        return USERS.values().stream()
                .filter(UserInfo::isActive)
                .count();
    }

    /**
     * 验证用户角色
     *
     * @param userId       用户ID
     * @param requiredRole 所需角色
     * @return 是否拥有指定角色
     */
    public boolean hasRole(String userId, String requiredRole) {
        UserInfo user = getUserById(userId);
        return user != null && requiredRole.equals(user.getRole());
    }

    /**
     * 检查用户是否为管理员
     *
     * @param userId 用户ID
     * @return 是否为管理员
     */
    public boolean isAdmin(String userId) {
        return hasRole(userId, "ADMIN");
    }

    /**
     * 检查用户是否为开发者
     *
     * @param userId 用户ID
     * @return 是否为开发者
     */
    public boolean isDeveloper(String userId) {
        return hasRole(userId, "DEVELOPER");
    }
}